<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>


  <script>
   /* 
    使用构造函数和ES6的类设计并测试以下需要
      需求1: 
        现在2个人, 都有姓名与年龄(值自己指定), 都能自我介绍自己的姓名和年龄,
           能得到当前的总人数
      需求2: 
        现在又有了一个学生, 它有身价的属性, 能介绍它的所有信息
        又有一个老师, 它有教授课程的属性, 能介绍它的所有信息
  */
    /* 
    基于构造函数的 原型链 + 借用构造函数的组合继承
      让子类型的原型指向父类型的实例
      让子类型的原型对象的constructor指向子类型
      借用父类型的构造函数, 用来一次性初始化多个同名的属性  ==> 简化了编码 
    */
   function Person (name, age) {
     this.name = name
     this.age = age

     // 让总人数增加1
    //  Person.prototype.count++
   }

   // 给原型对象添加方法
   Person.prototype.sayInfo = function () {
     console.log(`我叫${this.name}, 年方${this.age}`)
   }
   // 将总数量添加到原型对象上
  //  Person.prototype.count = 0

  //  const p1 = new Person('A', 23)
  //  const p2 = new Person('B', 21)
  //  console.log(p1.name, p1.age, p1.count)
  //  p1.sayInfo()

  function Student (name, age, price) {
    // this.name = name
    // this.age = age
    /* 借用父类型的构造函数, 用来一次性初始化多个同名的属性  ==> 简化了编码 */
    Person.call(this, name, age)  
    this.price = price
  }

  /* 让子类型的原型指向父类型的实例 */
  Student.prototype = new Person()
  /* 让子类型的原型对象的constructor指向子类型 */
  Student.prototype.constructor = Student
  // 给原型对象添加sayInfo方法  (相当于重写了继承来的方法)
  Student.prototype.sayInfo = function () {
    console.log(`我叫${this.name}, 年方${this.age}, 每月薪资${this.price}`)
  }


  const s1 = new Student('A', 21, 14000)
  const s2 = new Student('B', 23, 18000)
  s1.sayInfo()
  console.log(s1)
  console.log(s1.constructor) // 应该是Student


  /* 
  class的继承
  类的本质也是函数
  */
    class Person2 {
      constructor (name, age) {
        this.name = name
        this.age = age
      }

      // 给原型对象添加方法
      sayInfo () {
        console.log(`我叫${this.name}, 年方${this.age}`)
      }
    }
    // console.log(typeof Person2)

    class Teacher extends Person2 {
      constructor (name, age, course) {
        super(name, age)  // 借用执行父类型的构造器来初始化子类型的属性
        this.course = course
      }

      sayInfo  () {
        console.log(`我叫${this.name}, 年方${this.age}, 课程${this.course}`)
      }
    }

    const t1 = new Teacher('D', 33, 'coding')
    console.log(t1.name, t1.age, t1.course)
    t1.sayInfo()


  
  </script>
  
</body>
</html>